import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 商品存储类，负责商品数据的文件存储和读取
 * 提供商品的持久化存储、加载、查询、添加和删除功能
 */
public class ProductStorage {
    private static final String DEFAULT_FILE_PATH = "products.dat";

    /**
     * 保存商品列表到文件
     * @param products 要保存的商品列表
     * @param filePath 文件路径，如果为null则使用默认路径
     * @return 保存成功返回true，否则返回false
     */
    public static boolean saveProducts(List<Product> products, String filePath) {
        if (products == null) {
            return false;
        }

        String actualFilePath = filePath != null ? filePath : DEFAULT_FILE_PATH;

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(actualFilePath))) {
            oos.writeObject(products);
            System.out.println("成功保存 " + products.size() + " 个商品到文件: " + actualFilePath);
            return true;
        } catch (IOException e) {
            System.err.println("保存商品到文件时出错: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 从文件加载商品列表
     * @param filePath 文件路径，如果为null则使用默认路径
     * @return 加载的商品列表，如果文件不存在或加载失败则返回空列表
     */
    @SuppressWarnings("unchecked")
    public static List<Product> loadProducts(String filePath) {
        String actualFilePath = filePath != null ? filePath : DEFAULT_FILE_PATH;
        File file = new File(actualFilePath);

        if (!file.exists()) {
            System.out.println("文件不存在，返回空商品列表: " + actualFilePath);
            return new ArrayList<>();
        }

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(actualFilePath))) {
            List<Product> products = (List<Product>) ois.readObject();
            System.out.println("成功从文件加载 " + products.size() + " 个商品: " + actualFilePath);
            return products;
        } catch (IOException | ClassNotFoundException e) {
            System.err.println("从文件加载商品时出错: " + e.getMessage());
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    /**
     * 保存单个商品到文件（将商品添加到现有列表后保存）
     * @param product 要保存的商品
     * @param filePath 文件路径，如果为null则使用默认路径
     * @return 保存成功返回true，否则返回false
     */
    public static boolean saveSingleProduct(Product product, String filePath) {
        if (product == null) {
            return false;
        }

        List<Product> products = loadProducts(filePath);
        products.add(product);
        return saveProducts(products, filePath);
    }

    /**
     * 根据商品ID删除商品
     * @param productId 要删除的商品ID
     * @param filePath 文件路径，如果为null则使用默认路径
     * @return 删除成功返回true，未找到商品返回false
     */
    public static boolean deleteProduct(String productId, String filePath) {
        List<Product> products = loadProducts(filePath);
        boolean removed = products.removeIf(p -> p.getProductId().equals(productId));
        
        if (removed) {
            return saveProducts(products, filePath);
        }
        return false;
    }

    /**
     * 根据商品ID查找商品
     * @param productId 要查找的商品ID
     * @param filePath 文件路径，如果为null则使用默认路径
     * @return 找到的商品，如果不存在则返回null
     */
    public static Product findProductById(String productId, String filePath) {
        List<Product> products = loadProducts(filePath);
        for (Product product : products) {
            if (product.getProductId().equals(productId)) {
                return product;
            }
        }
        return null;
    }

    /**
     * 根据商品名称查找商品（支持模糊匹配）
     * @param name 商品名称关键字，不区分大小写
     * @param filePath 文件路径，如果为null则使用默认路径
     * @return 匹配的商品列表
     */
    public static List<Product> findProductsByName(String name, String filePath) {
        List<Product> products = loadProducts(filePath);
        List<Product> result = new ArrayList<>();
        
        if (name == null || name.trim().isEmpty()) {
            return result;
        }
        
        String keyword = name.toLowerCase();
        for (Product product : products) {
            if (product.getName().toLowerCase().contains(keyword)) {
                result.add(product);
            }
        }
        return result;
    }
}